package main

import "fmt"

// 实现go多态，需要实现定义接口
// 人类的武器发起攻击，不同等级子弹效果不同

// 定义一个接口，注意类型是Interface
type IAttack interface {
	//接口函数可以有多个，但是只能有函数原型，不可以有实现
	Attack()
	//Attack1()

}

// 低等级
type HumanLowlevel struct {
	name  string
	level int
}

func (a *HumanLowlevel) Attack() {
	fmt.Println("我是:", a.name, "等级:", a.level, ",造成1000点伤害")
}

// 低等级
type HumanHighlevel struct {
	name  string
	level int
}

func (a *HumanHighlevel) Attack() {
	fmt.Println("我是:", a.name, "等级:", a.level, ",造成90000点伤害")
}

// 定义一个多态的通用接口，传入不同对象，调用同样的方法，实现不同的效果===》多态
func DoAttack(a IAttack) {
	a.Attack()

}

func main() {
	//var player interface{}
	var player IAttack //定义一个包含Attack的接口变量

	lowlevel := HumanLowlevel{
		name:  "DAvid",
		level: 1,
	}

	highlevel := HumanLowlevel{
		name:  "DAvid",
		level: 10,
	}

	lowlevel.Attack()
	highlevel.Attack()

	//对player赋值为lowlevel，接口需要使用指针类型来赋值
	player = &lowlevel
	player.Attack()

	player = &highlevel
	player.Attack()

	fmt.Println("多态。。。。。。。")
	DoAttack(&lowlevel)
	DoAttack(&highlevel)
}
